package com.jch.case2.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

/*
    TODO:
        1. /user/* 表示目录匹配，在前端输入的路径只要以/user开始都会访问当前User1Servlet
            前端访问后端的路径：
                http://localhost:8080/user/findAll  表示查询所有用户
                http://localhost:8080/user/update  表示更新用户
                http://localhost:8080/user/add   表示添加用户
                我们在后端向知道用户即前端执行哪个功能就是根据请求资源路径最后一级目录判断的，因此我们需要获取请求资源
                路径的最后一级目录：
                    findAll  表示查询所有用户
                    update  表示更新用户
                    add   表示添加用户
 */
//@WebServlet("/user/*")
public class User1Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //1.获取请求资源路径
        String uri = request.getRequestURI();// /user/findAll  /user/update
        //2.获取uri表示的最后一个/的索引
        int lastIndex = uri.lastIndexOf("/");
        //3.根据上述获取的最后一个/的索引截取最后/下个字符一直到字符串末尾 findAll update
        //参数lastIndex + 1==》这里+1的原因是我们向截取最后一个/的下哥字符开始一直到字符串uri的末尾
        String methodName = uri.substring(lastIndex + 1);
        //System.out.println("methodName = " + methodName);// findAll update
        //4.判断要执行哪个方法
        /*if("findAll".equals(methodName)){
            //说明是查询所有用户功能
            findAll(request,response);
        }else if("update".equals(methodName)){
            //说明是更新用户功能
            update(request,response);
        }else if("add".equals(methodName)){
            //说明是添加用户功能
            add(request,response);
        }else if("delete".equals(methodName)){
            //说明是删除用户功能
            delete(request,response);
        }*/

        /////////////////////////////////////////////////////////////////////////////////////
        //TODO:使用反射执行上述过多if语句问题
        try {
            //1.获取当前类的Class对象
            //TODO:这里的this表示当前类的对象即User1Servlet类的对象
            Class<?> clazz = this.getClass();
            //2.获取要执行的方法
        /*
            public Method getMethod(String name, Class<?>... parameterTypes)
                            参数：
                                name:方法名 delete add  update findAll
                                parameterTypes：要执行方法的形参Class类型
         */
            //methodName =  方法名 delete add  update findAll
            Method m = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
            //3.执行方法
            /*
                Methhod类中的方法：执行方法
                public Object invoke(Object obj, Object... args)
                                    参数：
                                        obj:要执行方法依赖的对象，delete方法依赖对象是User1Servlet对象即this
                                        args:要执行方法的实参 request response
                                    返回值：Object 表示要执行方法的返回值，如果执行方法没有返回值这里是null
             */
            m.invoke(this,request,response);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void delete(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("删除用户");
    }

    public void add(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("添加用户");
    }

    public void update(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("更新用户");
    }

    public void findAll(HttpServletRequest request, HttpServletResponse response) {
        System.out.println("查询所有用户");
    }
}
